[REC-AI-022] Реализовать семантический DLQ-инкубатор для неструктурированных ответов LLM

Обработка Semantic Garbage ошибок ИИ-моделей Ollama без блокировки конвейера Kafka

Author

Services Task & Simulation Framework Documentation

Published

September 28, 2026

NoteКраткая карточка задачи
  • Репозиторий / Компонент: receipt-processor-service / package worker.
  • Тип задачи: Инфраструктурная / Обработка ошибок ИИ (AI Data Pipeline).
  • Связанные документы: receipt-processor.qmd (Раздел 3.1 Инвариант изоляции ИИ-сбоев).
  • Статус: Готово к реализации

  • Описание задачи:

    Текущая архитектура OCRWorker и FilterWorker корректно обрабатывает инфраструктурные сбои (сетевая недоступность Ollama). Однако существует критическая уязвимость типа Semantic Garbage (Семантический мусор): если сервер ИИ доступен, но локальная модель Llama Vision или Qwen сгенерировала битый, невалидный JSON, метод json.Unmarshal выбрасывает ошибку парсинга. В текущей реализации воркер прерывает выполнение и оставляет сообщение в Кафке, что вызывает бесконечный цикл повторов (infinite retry Loop) и намертво блокирует чтение всей партиции Kafka для чеков других пользователей.

    Необходимо внедрить семантический паттерн Dead Letter Queue (DLQ) с автоматическим транзитом бракованных ИИ-структур в очередь модерации.

  • Инструкция по шагам:

    1. Разделение типов ошибок: Внутри методов ProcessMessage воркеров разделить обработку ошибок на два класса:
      • Инфраструктурные (ошибки сети http.Do): возвращать error, сохраняя сообщение в топике.
      • Семантические (ошибки парсинга json.Unmarshal или пустой JSON): перехватывать и отправлять в изолятор.
    2. Реализация транзита в DLQ: При фиксации семантического сбоя, воркер должен извлечь исходное сообщение, обернуть его в метаструктуру с указанием типа сбоя (ocr_structural_broken_json) и опубликовать в выделенный топик Кафки receipts-dead-letter-queue. После публикации воркер обязан выполнить Commit Offset, освобождая партицию для следующих сообщений.
    3. Автоматическая интеграция с очередью модерации: Создать выделенный консьюмер DLQModerationConsumer, который слушает топик отстоя, извлекает сырой текст сбойного ответа ИИ и атомарно записывает его в таблицу voice_moderation_queue (или смежную receipt_moderation_queue) со статусом pending и детальным логом для ручного исправления оператором.